package com.lonewalker.sparrow.config;

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.github.yitter.contract.IdGeneratorOptions;
import com.github.yitter.idgen.YitIdHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * id生成器配置
 *
 * @author Wang Yu
 * @version 4.0
 */
@Configuration
@Slf4j
public class IdGeneratorConfiguration {
    /**
     * 初始化设置ID生成参数
     * <p>
     * 只需全局一次，且应在生成ID之前完成。
     * 更多参数参考 IdGeneratorOptions 定义。
     * </p>
     */
    @PostConstruct
    public void init() {
        //如果一台服务器部署多个独立服务，需要为每个服务指定不同的 WorkerId
        IdGeneratorOptions options = new IdGeneratorOptions((short) 4);
        // options.WorkerIdBitLength = 10; // 默认值6，限定 WorkerId 最大值为2^6-1，即默认最多支持64个节点。
        // options.SeqBitLength = 6; // 默认值6，限制每毫秒生成的ID个数。若生成速度超过5万个/秒，建议加大 SeqBitLength 到 10。
        // 如果要兼容老系统的雪花算法，此处应设置为老系统的BaseTime。此处设置时间为：2023-12-14 10:28:41
        options.BaseTime = 1702520921000L;
        YitIdHelper.setIdGenerator(options);
        log.info("分布式id初始化完成");
    }

    /**
     * 配置Mybatis-plus主键生成策略
     *
     * @return id生成器
     */
    @Bean
    public IdentifierGenerator idGenerator() {
        return entity -> YitIdHelper.nextId();
    }
}
